package com.easy;

import java.util.Arrays;
import java.util.HashMap;

public class TwoSum {

  /**
   * 两数之和
   * <p>
   * 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target 的那 两个 整数，并返回它们的数组下标。
   * <p>
   * 你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。
   * <p>
   * 你可以按任意顺序返回答案。
   * <p>
   * 来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/two-sum 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
   */
  public static void main(String[] args) {
    int[] nums = {6, 4, 3, 1, 2};
    int k = 1;
    System.out.println(Arrays.toString(towSum(nums, k)));
  }

  /**
   * hash 表最优 2 ms	38 MB
   */
  public static int[] towSum(int[] nums, int target) {

    HashMap<Integer, Integer> res = new HashMap<>();

    for (int i = 0; i < nums.length; i++) {

      int diff = target - nums[i];

      if (res.containsKey(diff)) {
        return new int[]{res.get(diff), i};
      }

      res.put(nums[i], i);

    }
    return null;
  }

  /**
   * 暴力搜索 70 ms	38.3 MB
   */
  public static int[] towSum2(int[] nums, int target) {

    int[] res = new int[2];
    for (int i = 0; i < nums.length; i++) {
      for (int j = 0; j < nums.length; j++) {
        int i_v = nums[i];
        int j_v = nums[j];
        if (i_v + j_v == target) {
          res[0] = i;
          res[1] = j;
          return res;
        }
      }
    }
    return res;
  }


}
